package com.yx.websocketim

import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView


/**
 * Creator:Yx
 * Time:2022/7/11 16:19
 * Description:
 * Kotlin属于跨平台编译语言，除了可以进行原声开发外很好的支持Java服务端程序开发、Android应用程序开发以及JavaScript开发
 * Kotlin基于JVM的字节码结构（与java同属静态语言），Kotlin 应用程序的运行速度与 Java 类似。，但随着 Kotlin 对内联函数的支持，
 * 使用 lambda 表达式的代码通常比用 Java 写的代码运行得更快。
 *
 * Kotlin 的基本数据类型包括 Byte、Short、Int、Float、Long、Double 、Boolean,
 * 在java中基本数据类型共有八种：byte、short、int、long，float、double ，char ， boolean，
 * 不同于 Java 的是，Kotlin 字符不属于数值类型，是一个独立的数据类型,
 *
 * Kotlin的基本数据类型和java不一样，Kotlin 中其实没有基础数据类型，只有封装的对象类型，你每定义的一个变量，
 * 其实Kotlin 帮你封装了一个对象，这样可以保证不会出现空指针
 *
 * Kotlin 中的 Char 不能直接和数字操作（可以通过显示转换char.toInt()），
 * Char 必需是单引号 ' 包含起来的。比如普通字符 '0'，'a'，字符字面值用单引号括起来: '1'。
 * 特殊字符可以用反斜杠转义。 支持这几个转义序列：\t、 \b、\n、\r、\'、\"、\\ 和 \$。
 * 当需要可空引用时，像数字、字符会被装箱。装箱操作不会保留同一性。
 *
 * 布尔用 Boolean 类型表示，它有两个值：true 和 false。当需要可空引用布尔会被装箱。
 *
 * 数组用Array类实现，具有size属性、get、set方法。数组的创建两种方式：一种是使用函数arrayOf()；另外一种是使用工厂函数。
 * 除了类Array，还有ByteArray, ShortArray, IntArray，LongArray等用来表示各个类型的数组，省去了装箱操作，因此效率更高，其用法同Array一样
 *
 * 字符串和java一样，String属于不可变的，String必需是双引号"",Kotlin可以通过[]很方便访问对应下标字符，
 * java中通过chatAt方法或者subString等方式获取对应字符，Kotlin中String支持遍历形式访问其中的字符，这一点很使用；
 * String 可以通过 trim(),trimEnd(),trimStart(),trimMargin() 等方法来删除多余的空白
 *
 * 在不进行显式转换的情况下我们不能把 Byte 型值赋给一个 Int 变量，
 * val b: Byte = 1 // OK, 字面值是静态检测的
 * val i: Int = b.toInt() // OK
 * 每种数据类型都有下面的这些方法，可以转化为其它的类型：
 * toByte(): Byte 。toShort(): Short 。toInt(): Int 。toLong(): Long 。toFloat(): Float 。toDouble(): Double 。toChar(): Char
 *
 * 定义只读变量使用关键字val定义-----可重新赋值的变量使用var关键字
 * inner关键字修饰表示内部类
 *
 * 1.类无需Public ,2.继承用: ，3方法用fun , 系统方法fun前面加override
 */
class MainActivity : AppCompatActivity() {

    private lateinit var tvMessage: TextView
    private lateinit var tvEdit: TextView
    private lateinit var tvOk: TextView
    private lateinit var recyclerView: RecyclerView

    // 静态 伴生对象,伴生对象在类中只能存在一个
    companion object {
        private lateinit var adapter: RecyclerViewsAdapter

        // 此Handler用于接收广播中的消息
        var handler: Handler = Handler(Looper.getMainLooper()) {
            when (it.what) {
                67367 -> { // MSG返回
                    val obgMsg = it.obj.toString()
                    LogUtils.iYx("——>回调Handler收到<——")
                    adapter.addData(obgMsg)
                }
            }
            false
        }

    }


    override fun onCreate(savedInstanceState: Bundle?) { // 参数变量：类型  ?可为空
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) // 无需分号结尾
        // S2.数组实现：使用工厂函数
        val x: IntArray = intArrayOf(1, 2, 3)

        // Elvis 操作符表达:  if(savedInstanceState){返回 savedInstanceState.toString(); }else{返回-1;}
        val l = savedInstanceState?.toString() ?: -1
        main(arrayOf("A", "B", "C"))

        tvMessage = findViewById(R.id.tv_message)
        tvEdit = findViewById(R.id.tv_edit)
        tvOk = findViewById(R.id.tv_ok)
        tvOk.setOnClickListener(clicks)
        recyclerView = findViewById(R.id.rv_msg)

        // 禁止滑动recyclerView.setNestedScrollingEnabled(true);
        recyclerView.isNestedScrollingEnabled = true
        val linearLayoutManager =
            object : LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) {
                override fun canScrollVertically(): Boolean {  // 禁止滑动加强
                    return false
                }
            }
        recyclerView.layoutManager = linearLayoutManager
        adapter = RecyclerViewsAdapter(this)
        recyclerView.adapter = adapter

        // 启动Service
        startServiceMsg("")


    }


    // S1.数组实现:函数arrayOf()
    fun main(mStr: Array<String>) {

        //[1,2,3]
        val a = arrayOf(1, 2, 3)
        //读取数组内容
        LogUtils.iYx("" + a[0])  // 输出结果：1

        for (c in mStr) {
            LogUtils.iYx(c)
        }

    }


    // val listener:WebSocketListener = object : WebSocketListener(){}
    // val clicks = View.OnClickListener { v -> { when (v?.id) {} } } // lambda表达式
    private val clicks = object : View.OnClickListener { // 非lambda，用lambda更安全
        override fun onClick(v: View?) {
            when (v?.id) {
                R.id.tv_ok -> {
                    // 发送消息：通过Service特性如果已启动不在执行onCreate，而是多次执行onStartCommand方法
                    // 在onStartCommand中进行发送消息。不太推荐，最好还是用广播传递吧
                    val str = tvEdit.text.trim().toString()
                    if (str.isNotEmpty())
                        startServiceMsg(str)
                    // msgService.sendMessage(json.toString());
                    tvEdit.text = ""
                }

            }
        }
    }


    /**
     * 启动Service及发送消息
     */
    private fun startServiceMsg(string: String) {
        if (string.isEmpty()) {
            // 启动Service
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForegroundService(Intent(this, MsgService::class.java)) // 间隔重启时间1分钟
            } else {
                startService(Intent(this, MsgService::class.java)) // 间隔重启时间1分钟
            }
        } else {
            // 发送消息：通过Service特性如果已启动不在执行onCreate，而是多次执行onStartCommand方法
            // 在onStartCommand中进行发送消息。不太推荐，最好还是用广播传递吧
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForegroundService(
                    Intent(this, MsgService::class.java)
                        .putExtra("Texts", string)
                )
            } else {
                startService(
                    Intent(this, MsgService::class.java)
                        .putExtra("Texts", string)
                )
            }
        }

    }


    override fun onDestroy() {
        super.onDestroy()
        // 停止广播接收器 —— 动态注册广播才适用
        // unregisterReceiver( )
        // 停止服务
        val intent = Intent(this, MsgService::class.java)
        stopService(intent)
    }

}